﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FrameworkLib.Facades;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;

namespace GestionePolveriLib.Facades
{
    [Serializable]
    public class CostiAggiuntiviFacade : FacadeBase<GestionePolveriEntities>
    {
        GestionePolveriEntities context = null;

        public CostiAggiuntiviFacade()
        {
            context = this.GetContext();
        }

        public CostiAggiuntiviFacade(string connectionString)
        {
            context = this.GetContext(connectionString);
        }

        public void LoadAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => GetAll(), callback);
        }

        public List<CostoAggiuntivo> GetAll()
        {
            List<CostoAggiuntivo> retValue = null;

            try
            {
                var objs = from x in context.CostiAggiuntivi
                           select new CostoAggiuntivo { 
                               ID = x.IDCostiAgg,
                               IDFattura = x.IDFattura,
                               IDFamiglia = x.IDFamiglia,
                               Costo = (x.CostoAgg.HasValue ? x.CostoAgg.Value : 0)
                           };

                if (objs.Any())
                {
                    retValue = objs.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<CostoAggiuntivo> GetByFattura(long idFattura, int idFamiglia)
        {
            List<CostoAggiuntivo> retValue = null;

            try
            {
                var objs = from x in context.CostiAggiuntivi
                           where x.IDFattura == idFattura && x.IDFamiglia == idFamiglia
                           select new CostoAggiuntivo
                           {
                               ID = x.IDCostiAgg,
                               IDFattura = x.IDFattura,
                               IDFamiglia = x.IDFamiglia,
                               Costo = (x.CostoAgg.HasValue ? x.CostoAgg.Value : 0)
                           };

                if (objs.Any())
                {
                    retValue = objs.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<CostoAggiuntivo> GetByFattura(long idFattura)
        {
            List<CostoAggiuntivo> retValue = null;

            try
            {
                var objs = from x in context.CostiAggiuntivi
                           where x.IDFattura == idFattura
                           select new CostoAggiuntivo
                           {
                               ID = x.IDCostiAgg,
                               IDFattura = x.IDFattura,
                               IDFamiglia = x.IDFamiglia,
                               Costo = (x.CostoAgg.HasValue ? x.CostoAgg.Value : 0)
                           };

                if (objs.Any())
                {
                    retValue = objs.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool Add(CostoAggiuntivo data)
        {
            bool retValue = false;

            try
            {
                CostiAggiuntivi ca = new CostiAggiuntivi();
                ca.IDFattura = data.IDFattura;
                ca.IDFamiglia = data.IDFamiglia;
                ca.CostoAgg = data.Costo;

                context.CostiAggiuntivi.AddObject(ca);
                context.SaveChanges();

                retValue = true;
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool Delete(CostoAggiuntivo data)
        {
            bool retValue = false;

            try
            {
                var obj = from x in context.CostiAggiuntivi
                          where x.IDCostiAgg == data.ID
                          select x;

                if (obj.Any())
                {
                    CostiAggiuntivi ca = obj.SingleOrDefault();

                    context.DeleteObject(obj);
                    context.SaveChanges();
                }

                retValue = true;
            }
            catch (Exception ex)
            {
                //throw ex;
            }

            return retValue;
        }

        public bool Modify(CostoAggiuntivo data)
        {
            bool retValue = false;

            try
            {
                var obj = from x in context.CostiAggiuntivi
                          where x.IDCostiAgg == data.ID
                          select x;

                if (obj.Any())
                {
                    CostiAggiuntivi ca = obj.SingleOrDefault();

                    ca.IDFattura = data.IDFattura;
                    ca.IDFamiglia = data.IDFamiglia;
                    ca.CostoAgg = data.Costo;

                    context.SaveChanges();
                }

                retValue = true;
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool AddOrModify(CostoAggiuntivo data)
        {
            bool retValue = false;

            try
            {
                CostiAggiuntivi objCA = null;

                var obj = from x in context.CostiAggiuntivi
                          where x.IDFattura == data.IDFattura
                          select x;

                if (obj.Any())
                {
                    objCA = obj.FirstOrDefault();
                }
                else
                {
                    objCA = new CostiAggiuntivi();
                    context.CostiAggiuntivi.AddObject(objCA);
                }

                objCA.IDFattura = data.IDFattura;
                objCA.IDFamiglia = data.IDFamiglia;
                objCA.CostoAgg = data.Costo;

                context.SaveChanges();

                retValue = true;
            }
            catch (Exception ex)
            {
                this.LastExceptionOccurred = ex;
                throw ex;
            }

            return retValue;
        }

        public static void AddCostoAggiuntivo(Lotto lotto, CostoAggiuntivo costo)
        {
            if (lotto.CostiAggiuntivi == null)
            {
                lotto.CostiAggiuntivi = new List<CostoAggiuntivo>();
            }

            lotto.CostiAggiuntivi.Add(costo);
        }

        //public CostoAggiuntivo GetCostoAggiuntivo(Lotto lotto)
        //{
        //    CostoAggiuntivo retValue = null;

        //    try
        //    {              
        //        var obj = from x in context.Lotti
        //                  where x.IDLotto == lotto.IDLotto
        //                  select x;

        //        if (obj.Any())
        //        {
        //            Lotti m_lotto = obj.FirstOrDefault();
                 
        //            var objs2 = from x in context.CostiAggiuntivi
        //                        where x.IDFattura == m_lotto.IDFattura
        //                        select new CostoAggiuntivo
        //                        {
        //                            ID = x.IDCostiAgg,
        //                            IDFamiglia = x.IDFamiglia,
        //                            Costo = (x.CostoAgg.HasValue ? x.CostoAgg.Value : 0)
        //                        };

        //            if (objs2.Any())
        //            {
        //                CostiAggiuntivi ca =  m_lotto.IDFattura

        //                if (ca != null)
        //                {
        //                    retValue = new CostoAggiuntivo();
        //                    retValue.IDFamiglia = ca.IDFamiglia;
        //                    retValue.Costo = ca.CostoAgg.GetValueOrDefault();
        //                }
        //            }
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        throw ex;
        //    }

        //    return retValue;
        //}
    }
}
